/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package negocio.administrador;

import datos.*;
import db.ConectarDB;
import interfaz.FRLabPaez;
import java.io.Serializable;
import java.sql.ResultSet;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JOptionPane;
import negocio.contenedor.*;

/**
 *
 * @author Kriathos
 */
public class LabPaez implements Serializable {

    private static ArrayList<Analito> listaAnalitosConsultaExamen = new ArrayList<>();
    private static ListaAnalitoParametro listaAnalitoParametro = new ListaAnalitoParametro();
    private static ListaPacientes listaPacientes = new ListaPacientes();
    private static ListaTipoAnalito listaTipoAnalito = new ListaTipoAnalito();
    private static ListaTipoExamen listaTipoExamen = new ListaTipoExamen();
    //Variables de combos
    private static ArrayList<ObjetoCombo> listaComboAnalitos;
    private static ArrayList<ObjetoCombo> listaComboAnalitosEnExamenes;
    private static ArrayList<ObjetoCombo> listaComboExamenes;
    private static ArrayList<ObjetoCombo> listaComboPacientes;
    private static ArrayList<ObjetoCombo> listaComboExamenesDePaciente;
    private static String observaciones, recomendaciones, fecha, correoPaciente;
    //Lista temporal de analitos para agregar examenes
    private static ArrayList<Analito> listaTempAnalitos;
    private ConectarDB conn;

    public LabPaez() {
    }

    public ConectarDB getConn() {
        if (conn == null) {
            conn = new ConectarDB();
        }
        return conn;
    }

    public void setConn(ConectarDB conn) {
        this.conn = conn;
    }

    public static ListaAnalitoParametro getListaAnalitoParametro() {
        return listaAnalitoParametro;
    }

    public static void setListaAnalitoParametro(ListaAnalitoParametro listaAnalitoParametro) {
        LabPaez.listaAnalitoParametro = listaAnalitoParametro;
    }

    public static ArrayList<ObjetoCombo> getListaComboAnalitos() {
        return listaComboAnalitos;
    }

    public static void setListaComboAnalitos(ArrayList<ObjetoCombo> listaComboAnalitos) {
        LabPaez.listaComboAnalitos = listaComboAnalitos;
    }

    public static ArrayList<ObjetoCombo> getListaComboExamenes() {
        return listaComboExamenes;
    }

    public static void setListaComboExamenes(ArrayList<ObjetoCombo> listaComboExamenes) {
        LabPaez.listaComboExamenes = listaComboExamenes;
    }

    public static ArrayList<ObjetoCombo> getListaComboPacientes() {
        return listaComboPacientes;
    }

    public static void setListaComboPacientes(ArrayList<ObjetoCombo> listaComboPacientes) {
        LabPaez.listaComboPacientes = listaComboPacientes;
    }

    public static ListaPacientes getListaPacientes() {
        return listaPacientes;
    }

    public static void setListaPacientes(ListaPacientes listaPacientes) {
        LabPaez.listaPacientes = listaPacientes;
    }

    public static ListaTipoAnalito getListaTipoAnalito() {
        return listaTipoAnalito;
    }

    public static void setListaTipoAnalito(ListaTipoAnalito listaTipoAnalito) {
        LabPaez.listaTipoAnalito = listaTipoAnalito;
    }

    public static ArrayList<Analito> getListaTempAnalitos() {
        if (listaTempAnalitos == null) {
            listaTempAnalitos = new ArrayList<>();
        }
        return listaTempAnalitos;
    }

    public static void setListaTempAnalitos(ArrayList<Analito> listaTempAnalitos) {
        LabPaez.listaTempAnalitos = listaTempAnalitos;
    }

    public static ListaTipoExamen getListaTipoExamen() {
        return listaTipoExamen;
    }

    public static void setListaTipoExamen(ListaTipoExamen listaTipoExamen) {
        LabPaez.listaTipoExamen = listaTipoExamen;
    }

    public static ArrayList<ObjetoCombo> getListaComboAnalitosEnExamenes() {
        return listaComboAnalitosEnExamenes;
    }

    public static void setListaComboAnalitosEnExamenes(ArrayList<ObjetoCombo> listaComboAnalitosEnExamenes) {
        LabPaez.listaComboAnalitosEnExamenes = listaComboAnalitosEnExamenes;
    }

    public static ArrayList<ObjetoCombo> getListaComboExamenesDePaciente() {
        return listaComboExamenesDePaciente;
    }

    public static void setListaComboExamenesDePaciente(ArrayList<ObjetoCombo> listaComboExamenesDePaciente) {
        LabPaez.listaComboExamenesDePaciente = listaComboExamenesDePaciente;
    }

    public static ArrayList<Analito> getListaAnalitosConsultaExamen() {
        return listaAnalitosConsultaExamen;
    }

    public static void setListaAnalitosConsultaExamen(ArrayList<Analito> listaAnalitosConsultaExamen) {
        LabPaez.listaAnalitosConsultaExamen = listaAnalitosConsultaExamen;
    }

    public static String getFecha() {
        return fecha;
    }

    public static void setFecha(String fecha) {
        LabPaez.fecha = fecha;
    }

    public static String getObservaciones() {
        return observaciones;
    }

    public static void setObservaciones(String observaciones) {
        LabPaez.observaciones = observaciones;
    }

    public static String getRecomendaciones() {
        return recomendaciones;
    }

    public static void setRecomendaciones(String recomendaciones) {
        LabPaez.recomendaciones = recomendaciones;
    }

    public static String getCorreoPaciente() {
        return correoPaciente;
    }

    public static void setCorreoPaciente(String correoPaciente) {
        LabPaez.correoPaciente = correoPaciente;
    }

//-----------------------------------------------------------------------------------------------------------------------------
//METODOS
//-----------------------------------------------------------------------------------------------------------------------------
    public void cargarCombos() {
//         = conn.traerCombosTipo("tipoAnalito", "id_tipo_analito", "descripcion");
//         = conn.traerCombosTipo("tiposExamen", "id_tipo_examen", "descripcion");
//         = conn.traerComboPacientes();
        setListaComboAnalitos(new ArrayList<ObjetoCombo>());
        setListaComboExamenes(new ArrayList<ObjetoCombo>());
        setListaComboPacientes(new ArrayList<ObjetoCombo>());

        //Combo TipoAnalitos
        String query = "SELECT id_tipo_analito, descripcion FROM tipoAnalito";
        ResultSet rs = getConn().ejecutarQueryRS(query);

        try {
            while (rs.next()) {
                getListaComboAnalitos().add(new ObjetoCombo(Integer.parseInt(rs.getString(1)), rs.getString(2)));
            }
            getConn().cerrarConexion();
        } catch (Exception e) {
            System.out.println(e);
            getConn().cerrarConexion();
        }
        //Combo Tipos Examen
        query = "SELECT id_tipo_examen, descripcion FROM tiposExamen";
        rs = getConn().ejecutarQueryRS(query);

        try {
            while (rs.next()) {
                getListaComboExamenes().add(new ObjetoCombo(Integer.parseInt(rs.getString(1)), rs.getString(2)));
            }
            getConn().cerrarConexion();
        } catch (Exception e) {
            System.out.println(e);
            getConn().cerrarConexion();
        }

        //Combo Pacientes
        query = "SELECT id_paciente, nombre, apellido1, apellido2 FROM paciente";
        rs = getConn().ejecutarQueryRS(query);

        try {
            while (rs.next()) {
                getListaComboPacientes().add(new ObjetoCombo(Integer.parseInt(rs.getString(1)), rs.getString(2) + " "
                        + rs.getString(3) + " " + rs.getString(4)));
            }
            getConn().cerrarConexion();
        } catch (Exception e) {
            System.out.println(e);
            getConn().cerrarConexion();
        }
    }//Fin de cargarCombos

    public void cargarCombosAnalitosEnExamen(int idExamen) {
        setListaComboAnalitosEnExamenes(new ArrayList<ObjetoCombo>());

        //Combo Analitos por Examen, usado en el tab de Analitos y Examenes
        String query = "SELECT id_tipo_analito, descripcion FROM tipoAnalito where id_tipo_examen = '" + idExamen + "'";
        ResultSet rs = getConn().ejecutarQueryRS(query);

        try {
            if (!rs.next()) {
                setListaComboAnalitosEnExamenes(new ArrayList<ObjetoCombo>());
            }
            rs.previous();
            while (rs.next()) {
                getListaComboAnalitosEnExamenes().add(new ObjetoCombo(Integer.parseInt(rs.getString(1)), rs.getString(2)));
            }
            getConn().cerrarConexion();
        } catch (Exception e) {
            System.out.println(e);
            getConn().cerrarConexion();
        }
    }

    public void cargarComboExamenesPaciente(int idPaciente) {
        setListaComboExamenesDePaciente(new ArrayList<ObjetoCombo>());

        //Combo Examenes de Paciente en Consulta Examenes
        String query = "SELECT t1.id_examen, t3.descripcion, t1.fecha FROM examenPaciente t1"
                + " INNER JOIN Examen t2 ON t1.id_examen = t2.id_examen INNER JOIN tiposExamen t3 ON "
                + "t2.id_tipo_examen = t3.id_tipo_examen WHERE t1.id_paciente = '" + idPaciente + "'";
        ResultSet rs = getConn().ejecutarQueryRS(query);

        try {
            while (rs.next()) {
                DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                DateFormat df2 = new SimpleDateFormat("dd/MM/yyyy");
                Date date = df.parse(rs.getString(3));
                String fecha = df2.format(date);
                getListaComboExamenesDePaciente().add(new ObjetoCombo(Integer.parseInt(rs.getString(1)), rs.getString(2)
                        + " " + fecha));
            }
            getConn().cerrarConexion();
        } catch (Exception e) {
            System.out.println(e);
            getConn().cerrarConexion();
        }
    }

    public void agregarAnalitoListaTemp(String nombreAnalito, int idAnalito, double valor, double porcentaje) {
        Analito analito = new Analito(nombreAnalito, idAnalito, valor, porcentaje);
        getListaTempAnalitos().add(analito);
    }//Fin de agregarAnalitoListaTemp

    public boolean cargarBDPacientes() {
        Paciente p = new Paciente();
        String query = "SELECT * FROM `labpaezdb`.`paciente`";
        ResultSet rs = getConn().ejecutarQueryRS(query);
        listaPacientes = new ListaPacientes();
        try {
            while (rs.next()) {
                p.setNombre(rs.getString(2));
                p.setApellido1(rs.getString(3));
                p.setApellido2(rs.getString(4));
                p.setCedula(Long.parseLong(rs.getString(5)));
                p.setEdad(Integer.parseInt(rs.getString(6)));
                p.setTelefono(rs.getString(7));
                p.setCorreo(rs.getString(8));
                listaPacientes.getLista().add(p);
                p = new Paciente();
            }
            getConn().cerrarConexion();
        } catch (Exception e) {
            System.out.print(e);
            getConn().cerrarConexion();
        }
        return true;
    }//Fin de cargarBDPacientes

    public boolean cargarBDPacientesVisualizar(FRLabPaez ventana, String cedula) {
        try {
            Paciente p = new Paciente();
            String query = "SELECT * FROM `labpaezdb`.`paciente` WHERE identificacion ='" + cedula + "';";
            ResultSet rs = getConn().ejecutarQueryRS(query);
            ResultSet ps = getConn().ejecutarQueryRS(query);
            if (ps.next() != false) {
                listaPacientes = new ListaPacientes();
                System.out.println(rs);
                try {
                    while (rs.next()) {
                        ventana.getTxtNombre().setText(rs.getString(2));
                        ventana.getTxtApellido1().setText(rs.getString(3));
                        ventana.getTxtApellido2().setText(rs.getString(4));
                        ventana.getTxtIdentificacion().setText(rs.getString(5));
                        ventana.getTxtEdad().setText(rs.getString(6));
                        ventana.getTxtTelefono().setText(rs.getString(7));
                        ventana.getTxtCorreo().setText(rs.getString(8));

                        p.setNombre(rs.getString(2));
                        p.setApellido1(rs.getString(3));
                        p.setApellido2(rs.getString(4));
                        p.setCedula(Long.parseLong(rs.getString(5)));
                        p.setEdad(Integer.parseInt(rs.getString(6)));
                        p.setTelefono(rs.getString(7));
                        p.setCorreo(rs.getString(8));
                        listaPacientes.getLista().add(p);
                        p = new Paciente();
                    }
                    getConn().cerrarConexion();
                } catch (Exception e) {
                    System.out.println(e);
                    getConn().cerrarConexion();
                }
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            System.out.println(e);
            return false;
        }
    }//Fin de cargarBDPacientesVisualizar

    public boolean cargarBDTipoAnalito() {
        TipoAnalito p = new TipoAnalito();
//        String query = "SELECT * FROM `labpaezdb`.`tipoanalito`";
        String query = "SELECT t1.descripcion, t2.descripcion FROM tipoanalito t1 INNER JOIN tiposexamen t2 ON t1.id_tipo_examen = t2.id_tipo_examen";
        ResultSet rs = getConn().ejecutarQueryRS(query);

        listaTipoAnalito = new ListaTipoAnalito();
        try {
            while (rs.next()) {
                p.setNombre(rs.getString(1));
                p.setNombreTipoExamen(rs.getString(2));
                listaTipoAnalito.getLista().add(p);
                p = new TipoAnalito();
            }
            getConn().cerrarConexion();
        } catch (Exception e) {
            System.out.print(e);
            getConn().cerrarConexion();
        }
        return true;
    }//Fin de cargarBDTipoAnalito

    public boolean cargarBDTipoExamen() {
        TipoExamen p = new TipoExamen();
        String query = "SELECT * FROM `labpaezdb`.`tiposexamen`";
        ResultSet rs = getConn().ejecutarQueryRS(query);

        listaTipoExamen = new ListaTipoExamen();
        try {
            while (rs.next()) {
                p.setDescripcion(rs.getString(2));
                listaTipoExamen.getLista().add(p);
                p = new TipoExamen();
            }
            getConn().cerrarConexion();
        } catch (Exception e) {
            System.out.print(e);
            getConn().cerrarConexion();
        }
        return true;
    }//Fin de cargarBDTipoExamen

    public boolean cargarBDAnalitoParametro() {
        AnalitoParametro ap = new AnalitoParametro();
        TipoAnalito ta = new TipoAnalito();
        String query = "SELECT * FROM tipoanalito t1 INNER JOIN analitosparametro t2 ON t1.id_tipo_examen = t2.id_tipo_examen INNER JOIN "
                + "tiposexamen t3 ON t2.id_tipo_examen = t3.id_tipo_examen WHERE t1.id_tipo_analito = t2.id_tipo_analito";
        ResultSet rs = getConn().ejecutarQueryRS(query);

        listaAnalitoParametro = new ListaAnalitoParametro();
        try {
            while (rs.next()) {
                ta.setNombre(rs.getString(3));
                ta.setUnidad(rs.getString(4));
                ta.setNombreTipoExamen(rs.getString(12));
                listaAnalitoParametro.getListaTA().add(ta);
                ap.setvMax(Double.parseDouble(rs.getString(5)));
                ap.setvMin(Double.parseDouble(rs.getString(6)));
                ap.setpMax(Double.parseDouble(rs.getString(7)));
                ap.setpMin(Double.parseDouble(rs.getString(8)));
                ap.setIdA(Integer.parseInt(rs.getString(9)));
                ap.setIdE(Integer.parseInt(rs.getString(10)));
                listaAnalitoParametro.getListaAP().add(ap);
                ap = new AnalitoParametro();
                ta = new TipoAnalito();
            }
            getConn().cerrarConexion();
        } catch (Exception e) {
            System.out.print(e);
            getConn().cerrarConexion();
        }
        return true;
    }//Fin de cargarBDAnalitoParameto

    public void cargarListaAnalitosConsultaPac(int idExamen, int idPaciente) {
        String query = "select t3.descripcion, t2.id_analito, t2.valor, t2.porcentaje, t3.id_tipo_analito  "
                + "from analitoEnExamen t1 "
                + "inner join Analito t2 on t1.id_analito = t2.id_analito "
                + "inner join tipoAnalito t3 on t2.id_tipo_analito = t3.id_tipo_analito "
                + "where id_examen = " + idExamen;
        String query2 = "select id_tipo_examen from Examen where id_examen = " + idExamen;
        ResultSet rs2 = getConn().ejecutarQueryRS(query2);
        int idTipoExamen = 0;
        try {
            while (rs2.next()) {
                idTipoExamen = Integer.parseInt(rs2.getString(1));
            }
        } catch (Exception e) {
            idTipoExamen = 0;
        }

        ResultSet rs = getConn().ejecutarQueryRS(query);

        setListaAnalitosConsultaExamen(new ArrayList<Analito>());
        try {
            while (rs.next()) {
                String query3 = "select valor_min, valor_max, porcentaje_min, porcentaje_max "
                        + "from analitosparametro "
                        + "where id_tipo_analito = " + rs.getString(5)
                        + " and id_tipo_examen = " + idTipoExamen;
                double valMin = 0, valMax = 0, porcMin = 0, porcMax = 0;
                ResultSet rs3 = getConn().ejecutarQueryRS(query3);
                while (rs3.next()) {
                    try {
                        valMin = Double.parseDouble(rs3.getString(1));
                    } catch (Exception e) {
                        e.printStackTrace();
                        valMin = 0;
                    }
                    try {
                        valMax = Double.parseDouble(rs3.getString(2));
                    } catch (Exception r) {
                        r.printStackTrace();
                        valMax = 0;
                    }
                    try {
                        porcMin = Double.parseDouble(rs3.getString(3));
                    } catch (Exception k) {
                        k.printStackTrace();
                        porcMin = 0;
                    }
                    try {
                        porcMax = Double.parseDouble(rs3.getString(4));
                    } catch (Exception t) {
                        t.printStackTrace();
                        porcMax = 0;
                    }
                }
                getListaAnalitosConsultaExamen().add(new Analito(rs.getString(1), Integer.parseInt(rs.getString(2)),
                        Double.parseDouble(rs.getString(3)), Double.parseDouble(rs.getString(4)), valMin,
                        valMax, porcMin, porcMax));

                String query4 = "select observaciones, recomendaciones, fecha from ExamenPaciente where id_examen = "
                        + idExamen + " and id_paciente = " + idPaciente;
                ResultSet rs4 = getConn().ejecutarQueryRS(query4);
                while (rs4.next()) {
                    observaciones = rs4.getString(1);
                    recomendaciones = rs4.getString(2);
                    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                    DateFormat df2 = new SimpleDateFormat("dd/MM/yyyy");
                    Date date = df.parse(rs4.getString(3));
                    fecha = df2.format(date);
                }
                String query5 = "select correo from Paciente where id_paciente = " + idPaciente;
                ResultSet rs5 = getConn().ejecutarQueryRS(query5);
                while (rs5.next()) {
                    correoPaciente = rs5.getString(1);
                }
            }
            getConn().cerrarConexion();
        } catch (Exception e) {
            System.out.print(e);
            getConn().cerrarConexion();
        }
    }//cargarListaAnalitosConsultaPac
}//Fin de class
